package com.zhang.exceltest.modules.common.service.impl;

import com.zhang.exceltest.modules.common.entity.BaseEntity;
import com.zhang.exceltest.modules.common.repository.BaseRepository;
import com.zhang.exceltest.modules.common.service.BaseService;
import com.zhang.exceltest.modules.common.service.ExcelService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class BaseserviceImpl <T extends BaseEntity,ID,rep extends BaseRepository<T,ID>> implements BaseService<T,ID> {

    @Autowired
     private rep rep;

    @Autowired
    ExcelService<T> excelService;




    /**
     * 添加
     * @param entity 添加实体类
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public T save(T entity) {
        if (entity == null){
            throw new RuntimeException("Entity data cannot be empty！！");
        }
        return getJpaRepository().save(entity);
    }

    /**
     * 批量添加
     * @param entities 实体对象
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public List<T> saveAll(List<T> entities) {
        if (entities == null|| entities.isEmpty()){
            return new ArrayList<>();
        }
        List<T> result = new ArrayList<>();
        rep repo = getJpaRepository();
        for (T entity : entities) {
            result.add(repo.save(entity));
        }
        return null;
    }

    /**
     * 按id查询
     * @param id
     * @return
     */
    @Override
    public T get(ID id) {
        T entity = getEntity(id);
        if (entity == null) return null;
        return entity;
    }

    /**
     * 按id批量查询 逻辑
     * @param ids
     * @return
     */
    @Override
    public List<T> getByIdsLogic(Set<ID> ids) {
        return getJpaRepository().findByIdInAndDeleted(ids,false);
    }

    /**
     * 按id批量查询
     * @param ids
     * @return
     */
    @Override
    public List<T> getByIds(Set<ID> ids) {
        return getJpaRepository().findByIdIn(ids);
    }

    /**
     * 查询 逻辑
     * @param id
     * @return
     */
    @Override
    public T getLogic(ID id) {
        T entity = getEntity(id);
        if (entity == null || entity.getDeleted()== true) return null;
        return entity;
    }


    /**
     * 查询全部
     * @return
     */
    @Override
    public List<T> getAll() {
        return getJpaRepository().findAll();
    }

    /**
     * 逻辑删除
     * 更新时间字段会自动更新
     * @param id
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean deleteLogic(ID id) {
        T entity = getEntity(id);
        if (entity ==null) return true;
        if (entity.getDeleted() == true) return true;
        entity.setDeleted(true);
        getJpaRepository().save(entity);
        return true;
    }

    /**
     * 批量删除 逻辑
     * @param ids
     * @return
     */
    @Override
    public boolean deleteAllLogic(Set<ID> ids) {
        if (ids !=null && ids.size() > 0){
            for (ID id : ids) {
                deleteLogic(id);
            }
        }
        return true;
    }




//
//    /**
//     * ����ʵ���࣬�Զ���ȫ����ʱ����޸�ʱ�䣬�߼�ɾ��
//     * @param entity
//     * @return
//     */
//    @Override
//    public T save(T entity) {
//        if (entity == null){
//            throw new RuntimeException("Entity data cannot be empty��");
//        }
//        Date now = new Date();
//        if (entity.getCreateTime() == null) {
//            entity.setCreateTime(now);
//        }
//        if (entity.getUpdateTime() == null) {
//            entity.setUpdateTime(now);
//        }
//        entity.setDeleted(false);
//        return service.save(entity);
//    }
//
//
//    /**
//     * ����ȫ��ʵ����
//     * @param entities
//     * @return
//     */
//    @Transactional
//    @Override
//    public List<T> saveAll(List<T> entities) {
//
//        if (entities == null || entities.size() < 1){
//            return new ArrayList<>();
//        }
//        List<T> result = new ArrayList<>();
//        for (T entity : entities) {
//            result.add(save(entity));
//        }
//        return result;
//    }
//
//    @Override
//    public T get(ID id) {
//        return service.getOne(id);
//    }
//
//    @Override
//    public List<T> getByIds(Set<ID> ids) {
//        return service.findAllById(ids);
//    }
//

//
//    @Override
//    public void delete(ID id) {
//        service.deleteById(id);
//    }
//
//
//    /**
//     * �߼�ɾ��
//     * @param id
//     * @return
//     */
//    @Override
//    public boolean deleteLogic(ID id) {
//        T entity = get(id);
//        if (entity != null && entity.getDeleted() != true) {
//            service.save(entity);
//            return true;
//        }
//        return true;
//    }
//
//    @Override
//    public boolean deleteAllLogic(Set<ID> ids) {
//        if (ids!=null&&ids.size()>0){
//            for (ID id : ids) {
//                deleteLogic(id);
//            }
//        }
//        return true;
//    }



    /**
     * @return 返回默认查询对象
     */
    public rep getJpaRepository(){
        if (rep instanceof BaseRepository){
            return rep;
        }
        throw new RuntimeException("使用默认BaseserviceImpl方法，BaseRepository必须继承BaseRepository");
    }


    private T getEntity(ID id){
        if (id == null){
            return null;
        }
        return getJpaRepository().findById(id).orElse(null);
    }

    public String checkStringEmpty(String str){
        if (StringUtils.isEmpty(str)) return null;
        else return str;
    }


}
